package com.mtsmda.test;

import java.io.IOException;
import java.text.NumberFormat;
import java.util.ArrayList;

public class QuizFul {

	private int g = 10;

	public QuizFul() {
		g = 9;
	}

	public static void main(String[] args) {
		q2();
		System.out.println("*****");
		q3();
		System.out.println("*****");
		q4();
		System.out.println("*****");
		q5();
		System.out.println("*****");
		QuizFul quizFul = new QuizFul();
		System.out.println(quizFul.g);

		System.out.println("*****");
		q7();
		System.out.println("*****");
		q9();
		System.out.println("*****");
		q10();
	}

	private static void q1() {

		/*
		 * labеl1: for (int i = 0; i < 3; i++) { if (i == 1) continue lаbel1;
		 * label2: System.out.print("TEST "); lаbel3:; }
		 */

		// Ошибка времени выполнения
		// Ошибка компиляции
	}

	private static void q2() {
		String s1 = "abc";
		String s2 = new String("аbс");
		String s3 = "аbc";
		System.out.println(s1 == s2);
		System.out.println(s1 == s3);
		System.out.println(s1 == "аbс");
	}

	private static void q3() {
		for (int i = 2; i < 10; i = (i++) + i--, i++) {
			System.out.print(--i);
		}
		System.out.println();
	}

	private static void q4() {
		int a = 7;
		int b = 4;

		System.out.println(-a % b);
		System.out.println(a % -b);
		System.out.println((-a % b) == (a % -b));
	}

	/*
	 * Так как передача параметров в метод осуществляется по значению, то: -
	 * переменная x хранит то же самое число; - переменная y ссылается на тот же
	 * самый объект; - переменная z ссылается на тот же самый массив, что и
	 * внешние переменные.
	 * 
	 * Изменение значения x не влияет на значение внешней переменной. Объекты
	 * типа Integer являются неизменяемыми (immutable), поэтому после операции
	 * y++ переменная y будет ссылаться на новый объект (с увеличенным
	 * значением), а исходный объект останется нетронутым. Ссылка на массив
	 * позволяет свободно изменять значения элементов массива.
	 */
	private static void q5() {
		int x = 1;
		Integer y = new Integer(x);
		int[] z = { x };

		funcQ5(x, y, z);

		System.out.print(x);
		System.out.print(y);
		System.out.println(z[0]);
	}

	private static void funcQ5(int x, Integer y, int[] z) {
		x++;
		y++;
		z[0]++;
	}

	private static void q6() throws IOException {
		byte b[] = new byte[80];
		for (int i = 0; i < b.length; i++)
			b[i] = (byte) System.in.read();
		System.out.println("OK");
	}

	private static void q7() {
		Class c1 = new ArrayList<String>().getClass();
		Class c2 = new ArrayList<Integer>().getClass();
		System.out.println(c1 == c2);
		System.out.println(c1.equals(c2));
	}

	private static void q8() {
		String s = "true,false";
		// String stringNew = s[1];
	}

	private static void q9() {
		double d = Math.sqrt(-1);
		System.out.println(Double.NaN == d);
		d = d / 0;
		System.out.println(Double.isNaN(d));
	}

	private static void q10() {
		Integer ii = 1000;
		Integer jj = 2000;

		Integer iii = new Integer(1);
		Integer iii1 = new Integer(1);
		System.out.println("iii = " + (iii == iii1));

		Integer iiii = 1000;
		Integer iiii1 = 1000;
		System.out.println("iiii = " + (iiii == iiii1));

		/*
		 * При делении или умножении получаем в результате примитив и в итоге
		 * будут сравниваться примитивы, результат операции xor будет false, так
		 * как оба операнда true.
		 */

		System.out.print((ii * 2 == jj) ? "yes" : "no");
		System.out.print((jj / 2 == ii) ? "yes" : "no");
		System.out.print((ii * 2 == jj) ^ (jj / 2 == ii) ? "yes" : "no");
	}

	private static void q11() {
		float f = 123.45678f;
		NumberFormat numberFormat = NumberFormat.getInstance();
		numberFormat.setMaximumFractionDigits(2);
		System.out.println(numberFormat.format(f));
	}

}